package gkaylee

import (
	"errors"
	"io"
	"io/fs"
	"os"
	"path/filepath"
)

// CheckFileExist 文件是否存在
func CheckFileExist(path string) (bool, error) {
	_, err := os.Lstat(path)
	if err == nil {
		return true, nil
	}
	if errors.Is(err, fs.ErrNotExist) {
		return false, nil
	}
	return false, err
}

// GetFilename 获取文件名, 不包含后缀.
func GetFilename(path string) string {
	name := filepath.Base(path)
	return name[:len(name)-len(filepath.Ext(name))]
}

// CopyFile 拷贝文件, 包含文件属性(访问时间, 修改时间, 权限, 但文件创建时间无法被复制!)
func CopyFile(src, dst string) error {
	// 打开源文件
	srcFile, err := os.Open(src)
	if err != nil {
		return err
	}
	defer srcFile.Close()

	// 创建目标文件
	dstFile, err := os.Create(dst)
	if err != nil {
		return err
	}
	defer dstFile.Close()

	// 拷贝文件内容
	_, err = io.Copy(dstFile, srcFile)
	if err != nil {
		return err
	}

	// 获取源文件的属性
	srcInfo, err := os.Stat(src)
	if err != nil {
		return err
	}

	// 获取源文件的创建时间
	lastAccessTime, err := GetFileLastAccessTime(srcInfo)
	if err != nil {
		return err
	}

	// 修改目标文件的访问时间和修改时间
	err = os.Chtimes(dst, lastAccessTime, srcInfo.ModTime())
	if err != nil {
		return err
	}

	// 修改目标文件的权限
	err = os.Chmod(dst, srcInfo.Mode())
	if err != nil {
		return err
	}

	return nil
}
